/* eslint-disable */
// js-ignore
const fs = require("fs");

class jsLint {
  constructor() {
    this.validate()
  }
  print(color, msg) {
    let map = {
      bright: "\x1B[1m", // 亮色
      grey: "\x1B[2m", // 灰色
      italic: "\x1B[3m", // 斜体
      underline: "\x1B[4m", // 下划线
      reverse: "\x1B[7m", // 反向
      hidden: "\x1B[8m", // 隐藏
      black: "\x1B[30m", // 黑色
      red: "\x1B[31m", // 红色
      green: "\x1B[32m", // 绿色
      yellow: "\x1B[33m", // 黄色
      blue: "\x1B[34m", // 蓝色
      magenta: "\x1B[35m", // 品红
      cyan: "\x1B[36m", // 青色
      white: "\x1B[37m", // 白色
      blackBG: "\x1B[40m", // 背景色为黑色
      redBG: "\x1B[41m", // 背景色为红色
      greenBG: "\x1B[42m", // 背景色为绿色
      yellowBG: "\x1B[43m", // 背景色为黄色
      blueBG: "\x1B[44m", // 背景色为蓝色
      magentaBG: "\x1B[45m", // 背景色为品红
      cyanBG: "\x1B[46m", // 背景色为青色
      whiteBG: "\x1B[47m", // 背景色为白色
    };
    console.log(map[color] || map["bright"], msg, "\x1b[0m");
  }
  filePath() {
    return process.argv[2];
  }
  validate() {
    let p = this.filePath();
    let filePath = p.split("=")[1];
    let jsStr = fs.readFileSync(filePath).toString();

    let errors = [];
    // 页面中如果有配置js-ignore 则忽略js规则检查
    if(jsStr.includes('js-ignore')) return
    
    // 验证代码中如果出现  www.zlketang.com   或者shenji.zlketang.com   则不允许提交代码
    // 白名单配置
     const domainWhiteList = [
      'build/beforeBuild', 
      'config/env', 
      'config/envDefault', 
      'hooks/jslint',
      'hooks/csslint',
      'hooks/fileLint',
      'hooks/lint',
      'src/utils/tool',
      'server/static'
    ]
    let isDomianWhite = domainWhiteList.some(item => filePath.includes(item))
    // 不在白名单，就会校验
    if (!isDomianWhite) {
      let domainArr = [
        'shenji.zlketang.com',
        'shenjim.zlketang.com',
        'develop.zlketang.com',
        'cp.zlketang.com',
        'cpm.zlketang.com',
        'www.zlketang.com',
        'wap.zlketang.com'
      ]
      domainArr.forEach(item => {
        if (jsStr.includes(item))
          errors.push(
            `js校验不通过：${filePath}中不能直接使用${item}域名，请使用this.globalConfig对象获取配置域名`
          )
      })
      // 页面提交不允许出现console.log
      if (jsStr.includes('console.log')){
        errors.push(
          `js校验不通过：${filePath}中不能出现console.log,请及时删除`
        )
      }
    }

    //自定义规范: 不能使用location.href= 和location.replace()
    //不校验location的文件列表
    const locationWhiteList = [...domainWhiteList, 'src/utils/tool']

    //是否是location白名单文件
    let isLocationWhite = locationWhiteList.some(item =>
      filePath.includes(item)
    )

    //不在白名单，就会校验
    if (!isLocationWhite) {
      let hrefReg = /location\.href ?= ?/

      if (hrefReg.test(jsStr)) {
        errors.push(
          `校验不通过：${filePath}中不能直接使用location.href，请使用Vue.prototype.goTo方法，用法参见src/utils/tool.js！`
        )
      }

      if (jsStr.includes('location.replace')) {
        errors.push(
          `校验不通过：${filePath}中不能直接使用location.replace，请使用Vue.prototype.goTo方法，用法参见src/utils/tool.js！`
        )
      }
    }


    if (errors.length) {
      errors = errors.map((item, index) => {
        return `【${index + 1}】${item}`;
      });
      console.log("\n" + filePath + "\n");
      this.print("red", errors.join("  \n"));
      process.exit(1);
    } else {
      this.print(
        "green",
        `The path named "${filePath}" be validated successfully.`
      );
      process.exit(0);
    }
  }
}

new jsLint()
